32-on-64: New set_address_size domctl for switching to compat mode.
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Fri, 26 Jan 2007 13:27:01 +0000 (13:27 +0000)
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Fri, 26 Jan 2007 13:27:01 +0000 (13:27 +0000)
From: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Keir Fraser <keir@xensource.com>
tools/libxc/xc_dom_boot.c
xen/arch/x86/domctl.c
xen/include/public/domctl.h

index 36d6ef3e4dc548b6dec85241cc4db019ad108a42..44d46e3f66d0daa4f8782ccd670b3ccd48084bf0 100644 (file)
@@ -91,37 +91,33 @@ static int clear_page(struct xc_dom_image *dom, xen_pfn_t pfn)
 
 static int x86_compat(int xc, domid_t domid, char *guest_type)
 {
-#ifdef XEN_DOMCTL_set_compat
     static const struct {
        char           *guest;
-       unsigned long  cmd;
+       uint32_t        size;
     } types[] = {
-       { "xen-3.0-x86_32p", XEN_DOMCTL_set_compat },
-       { "xen-3.0-x86_64",  XEN_DOMCTL_set_native },
+       { "xen-3.0-x86_32p", 32 },
+       { "xen-3.0-x86_64",  64 },
     };
     DECLARE_DOMCTL;
     int i,rc;
 
     memset(&domctl, 0, sizeof(domctl));
     domctl.domain = domid;
+    domctl.cmd    = XEN_DOMCTL_set_address_size;
     for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
        if (0 == strcmp(types[i].guest, guest_type))
-           domctl.cmd = types[i].cmd;
-    if (0 == domctl.cmd)
+           domctl.u.address_size.size = types[i].size;
+    if (0 == domctl.u.address_size.size)
        /* nothing to do */
        return 0;
 
-    xc_dom_printf("%s: guest %s, cmd %d\n", __FUNCTION__,
-                 guest_type, domctl.cmd);
+    xc_dom_printf("%s: guest %s, address size %" PRId32 "\n", __FUNCTION__,
+                 guest_type, domctl.u.address_size.size);
     rc = do_domctl(xc, &domctl);
     if (0 != rc)
        xc_dom_printf("%s: warning: failed (rc=%d)\n",
                      __FUNCTION__, rc);
     return rc;
-#else
-    xc_dom_printf("%s: compiled without compat/native switching\n", __FUNCTION__);
-    return 0;
-#endif /* XEN_DOMCTL_set_compat */
 }
 
 
index 3eb34190532a428049c4fbdba6a2a894b2debfe0..b109fa0578e5670724dcf61f6c55967a5551e368 100644 (file)
@@ -354,6 +354,46 @@ long arch_do_domctl(
     }
     break;
 
+    case XEN_DOMCTL_set_address_size:
+    {
+        struct domain *d;
+
+        ret = -ESRCH;
+        if ( (d = find_domain_by_id(domctl->domain)) == NULL )
+            break;
+
+        switch ( domctl->u.address_size.size )
+        {
+#ifdef CONFIG_COMPAT
+        case 32:
+            ret = switch_compat(d);
+            break;
+        case 64:
+            ret = switch_native(d);
+            break;
+#endif
+        default:
+            ret = (domctl->u.address_size.size == BITS_PER_LONG) ? 0 : -EINVAL;
+            break;
+        }
+
+        put_domain(d);
+    }
+
+    case XEN_DOMCTL_get_address_size:
+    {
+        struct domain *d;
+
+        ret = -ESRCH;
+        if ( (d = find_domain_by_id(domctl->domain)) == NULL )
+            break;
+
+        domctl->u.address_size.size = BITS_PER_GUEST_LONG(d);
+
+        ret = 0;
+        put_domain(d);
+    }
+
     default:
         ret = -ENOSYS;
         break;
index b85e9cc609e7e213828b4f33ac87c2da9a76fe7e..539cb911910c08b3deb61c956dc6dc5a318dbad9 100644 (file)
@@ -401,6 +401,13 @@ typedef struct xen_domctl_hvmcontext {
 } xen_domctl_hvmcontext_t;
 DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
 
+#define XEN_DOMCTL_set_address_size 35
+#define XEN_DOMCTL_get_address_size 36
+typedef struct xen_domctl_address_size {
+    uint32_t size;
+} xen_domctl_address_size_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
+
 #define XEN_DOMCTL_real_mode_area     26
 struct xen_domctl_real_mode_area {
     uint32_t log; /* log2 of Real Mode Area size */
@@ -435,6 +442,7 @@ struct xen_domctl {
         struct xen_domctl_settimeoffset     settimeoffset;
         struct xen_domctl_real_mode_area    real_mode_area;
         struct xen_domctl_hvmcontext        hvmcontext;
+        struct xen_domctl_address_size      address_size;
         uint8_t                             pad[128];
     } u;
 };